package com.workflow.sdk.domain.service;

import com.workflow.sdk.core.WorkflowExecutorResult;
import com.workflow.sdk.domain.model.entity.dto.WorkflowerExecuteParamDto;
import com.workflow.sdk.domain.model.idenfifer.WorkflowId;

/**
 * Workflower
 *
 * @description: 执行器
 * @author: cyj
 * @date 2022 -06-06 09:52:22
 *
 *
 */
public interface Workflow {

    /**
     * Create workflow execute long 创建一个流程 并直接 doing start节点
     * 配置的流程必须有一个start节点，一个end节点，如果执行后下一个节点是end节点，则直接执行完成，既end节点不执行业务
     * 执行方法会开启一个事务
     * @param workflowId workflow id
     * @param relevance  relevance 自己的关联id
     * @return the long
     */
    Long createWorkflowExecute(WorkflowId workflowId, String relevance);

    /**
     * 同createWorkflowExecute  分表在指定表做业务流程操作，避免单表业务过大。
     * @param workflowId workflow id
     * @param relevance  relevance 自己的关联id
     * @return the long
     */
    Long createWorkflowExecuteWithTable(WorkflowId workflowId, String relevance, String tableName);

    /**
     * Workflow execute 执行工作流程
     * 配置的流程必须有一个start节点，一个end节点，如果执行后下一个节点是end节点，则直接执行完成，既end节点不执行业务
     * 执行方法会开启一个事务
     *  @param <T>                    parameter
     * @param workflowerExecuteParamDto workflow execute id 流程id
     * @return
     */
    <T> WorkflowExecutorResult workflowExecute(WorkflowerExecuteParamDto<T> workflowerExecuteParamDto);

    /**
     * 同workflowExecute  分表在指定表做业务流程操作，避免单表业务过大。
     *  @param <T>                    parameter
     * @param workflowerExecuteParamDto workflow execute id 流程id
     * @return
     */
    <T> WorkflowExecutorResult workflowExecuteWithTable(WorkflowerExecuteParamDto<T> workflowerExecuteParamDto, String tableName);

}
